package angels.bean;

import angels.dao.GenericDAO;
import angels.modelo.Anjo;
import angels.modelo.AnjoEvento;
import angels.modelo.AnjoEventoPK;
import angels.modelo.Evento;
import angels.rn.AnjoRN;
import angels.rn.EventoRN;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
//import org.primefaces.context.RequestContext;

@ManagedBean
@ViewScoped
public class EventoBean {

    private EventoRN eventoRN = new EventoRN();
    private AnjoRN anjoRN = new AnjoRN();
    private GenericDAO<Evento> dao = new GenericDAO<Evento>();
    private Evento evento;
    private AnjoEvento anjoEvento;
    private Anjo anjo = new Anjo();
    private List<Evento> eventos;
    private List<Anjo> anjosDisponiveis;
    /*
     * 1 - Exibir lista de eventos
     * 2 - Exibir formulário para cadastro de eventos
     * 3 - Exibir incluir anjos no eventos
     */
    private String renderControle;

    public String getTitulo() {
        iniciarBean();

        return "Eventos";
    }

    public void iniciarBean() {
        eventos = eventoRN.obterTodos();
        renderControle = "1";
        anjosDisponiveis = anjoRN.obterTodos();
    }

    public void novo() {
        if (evento == null) {
            evento = eventoRN.novo();
        }
        renderControle = "2";
    }

    public void voltar() {
        evento = null;
        renderControle = "1";
    }

    public void salvar() {
        if (eventoRN.salvar(evento)) {
            BeanUtil.criarMensagemDeInformacao("Evento Salvo com sucesso.", " O Evento: " + evento.getNome() + " Foi salvo na lista.");
            return;
        }

        BeanUtil.criarMensagemDeErro("Erro ao tentar slvar o evento.", "");
    }

    public void excluir() {
        if (eventoRN.remover(evento)) {
            BeanUtil.criarMensagemDeInformacao("Evento Removido da Lista.", "Evento: " + evento.getNome() + " foi removido da lista.");
            return;
        }
        BeanUtil.criarMensagemDeErro("O Evento não pode ser removido da Lista.", "Erro ao excluir Evento.");
    }

    public void irIncluirAnjos() {
        anjo = null;
        eventos = eventoRN.obterTodos();
        anjosDisponiveis = anjoRN.obterTodos();
        if (evento == null) {
            BeanUtil.criarMensagemDeErro("Nenhum Evento Selecionado.", "");
        }

        for (AnjoEvento anjoE : getAnjosDoEvento()) {
            getAnjosDisponiveis().remove(anjoE.getAnjo());
        }


        renderControle = "3";
    }

    public List<AnjoEvento> getAnjosDoEvento() {
        if (evento != null) {
            if (evento.getAnjoEventoList() == null) {
                evento.setAnjoEventoList(new ArrayList<AnjoEvento>());
            }
        }
        return evento.getAnjoEventoList();
    }

    public List<Anjo> getAnjosDisponiveis() {
        if (anjosDisponiveis == null) {
            anjosDisponiveis = anjoRN.obterTodos();

        }


        anjosDisponiveis.removeAll(getAnjosDoEvento());

        return anjosDisponiveis;
    }

    public void selecionar() {

        if (evento == null) {
            BeanUtil.criarMensagemDeAviso("Nenhum Evento Selecionado.", "");
            return;
        }
        if (anjo == null) {
            BeanUtil.criarMensagemDeAviso("Nenhum Anjo Selecionado.", "");
            return;
        }


        if (anjo != null && evento != null) {

            anjoEvento = new AnjoEvento();
            AnjoEventoPK anjoEventoPK = new AnjoEventoPK();
            anjoEventoPK.setAnjoId(anjo.getId());
            anjoEventoPK.setEventoId(evento.getId());
            anjoEvento.setEvento(evento);
            anjoEvento.setAnjo(anjo);
            anjoEvento.setAnjoEventoPK(anjoEventoPK);
//            String senha = gerarSenha(evento, anjo);
            //anjoEvento.setSenha(senha);

            if (getAnjosDoEvento().add(anjoEvento)) {

                if (getAnjosDisponiveis().remove(anjo)) {

                    if (eventoRN.salvar(evento)) {
                        getAnjosDisponiveis().remove(anjoEvento);
                        BeanUtil.criarMensagemDeInformacao(anjo.getNome() + " adicionado com sucesso.", "");
//                        context.addCallbackParam("adicionado", true);
                    }
                }

            } else {
                BeanUtil.criarMensagemDeInformacao("Não foi possível adicionar o anjo.", "Anjo: " + anjo.getNome());
            }


        }
    }

    public void remover() {
        System.out.println("Entrou: " + anjoEvento + " - Anjo: " + anjoEvento.getAnjo().getNome() + " - Evento: " + anjoEvento.getEvento().getNome());
        if (anjo != null && evento != null) {
            //System.out.println("Será: " + getAnjosDoEvento().remove(anjoEvento));
            if (getAnjosDoEvento().remove(anjoEvento)) {
                System.out.println("Remove");
                if (getAnjosDisponiveis().add(anjo)) {
                    System.out.println("add");
                    if (eventoRN.salvar(evento)) {
                        //getAnjosDisponiveis().remove(anjoEvento);
                        BeanUtil.criarMensagemDeInformacao(anjo.getNome() + " adicionado com sucesso.", "");
//                        context.addCallbackParam("adicionado", true);
                    }
                }

            } else {
                BeanUtil.criarMensagemDeInformacao("Não foi possível adicionar o anjo.", "Anjo: " + anjo.getNome());
            }


        }
//        if (anjo != null && evento != null) {
//
//            if (getAnjosDoEvento().remove(anjoEvento)) {
//
//                if (getAnjosDisponiveis().add(anjoEvento.getAnjo())) {
//
//                    if (eventoRN.salvar(evento)) {
//                        BeanUtil.criarMensagemDeInformacao("Anjo removido com sucesso.", "Anjo: " + anjo.getNome());
//                    }
//                }
//
//            } else {
//                BeanUtil.criarMensagemDeInformacao("Não foi possível remover o anjo.", "Anjo: " + anjo.getNome());
//            }
//        }
    }

    public void removerAnjoListas() {
        System.out.println("Entrou: " + anjoEvento + " - Anjo: " + anjoEvento.getAnjo().getNome() + " - Evento: " + anjoEvento.getEvento().getNome());
        System.out.println("Anjo: " + anjo);
        System.out.println("Evento: " + evento);
        anjo = anjoEvento.getAnjo();
        if (anjo != null && evento != null) {
            //System.out.println("Será: " + getAnjosDoEvento().remove(anjoEvento));
            if (getAnjosDoEvento().remove(anjoEvento)) {
                System.out.println("Remove");
                if (getAnjosDisponiveis().add(anjo)) {
                    System.out.println("add");
                    if (eventoRN.salvar(evento)) {
                        //getAnjosDisponiveis().remove(anjoEvento);
                        System.out.println("salvou");
                        BeanUtil.criarMensagemDeInformacao(anjo.getNome() + " adicionado com sucesso.", "");
//                        context.addCallbackParam("adicionado", true);
                    }
                }

            } else {
                BeanUtil.criarMensagemDeInformacao("Não foi possível adicionar o anjo.", "Anjo: " + anjo.getNome());
            }
        }
    }
//
//    public String gerarSenha(Evento evento1, Anjo anjo1) {
//
//        String senha = "";
//
//        String[] alfabeto = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
//            "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W",
//            "X", "Y", "Z"};
//
//        List<String> listaAlfabeto = new ArrayList<String>();
//
//        for (int i = 0; i < alfabeto.length; i++) {
//            String letra = alfabeto[i];
//            listaAlfabeto.add(letra);
//        }
//
//
//        if (evento1 != null && anjo1 != null) {
//
//            for (int i = 0; i < 5; i++) {
//
//                if (i == 1) {
//                    senha = senha + evento1.getId().toString();
//                } else if (i == 4) {
//                    senha = senha + anjo1.getId().toString();
//                } else {
//                    int sorteio = 0 + (int) (Math.random() * alfabeto.length);
//                    senha = senha + listaAlfabeto.get(sorteio);
//                }
//            }
//        }
//        return senha;
//    }

    public List<Evento> completeEvento(String digitacao) {

        if (digitacao.length() < 2) {
            return null;
        }

        digitacao = digitacao.trim();
        List<Evento> lista = dao.findByQueries("select o from Evento o "
                + "where o.nome like '%" + digitacao + "%' ", 20, 0);

        return lista;
    }

    //   ********************************** Gets e Sets ***************************
    public Evento getEvento() {
        return evento;
    }

    public void setEvento(Evento evento) {
        this.evento = evento;
    }

    public EventoRN getEventoRN() {
        return eventoRN;
    }

    public void setEventoRN(EventoRN eventoRN) {
        this.eventoRN = eventoRN;
    }

    /**
     * @return the anjo
     */
    public Anjo getAnjo() {
        return anjo;
    }

    /**
     * @param anjo the anjo to set
     */
    public void setAnjo(Anjo anjo) {
        this.anjo = anjo;
    }

    /**
     * @return the renderControle
     */
    public String getRenderControle() {
        return renderControle;
    }

    /**
     * @param renderControle the renderControle to set
     */
    public void setRenderControle(String renderControle) {
        this.renderControle = renderControle;
    }

    public List<Evento> getEventos() {
        if (eventos == null) {
            eventos = eventoRN.obterTodos();
        }
        return eventos;
    }

    public void setEventos(List<Evento> eventos) {
        this.eventos = eventos;
    }

    public AnjoEvento getAnjoEvento() {
        return anjoEvento;
    }

    public void setAnjoEvento(AnjoEvento anjoEvento) {
        this.anjoEvento = anjoEvento;
    }
}
